# -*- coding: utf-8 -*-

# Apache hosts control
#
# Author: GoTLiuM InSPiRiT <gotlium@gmail.com>
#
# Copyright 2010, GoTLiuM InSPiRiT <gotlium@gmail.com>.
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2, as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranties of
# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
# PURPOSE.  See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see <http://www.gnu.org/licenses/>.

import os;
import sys;
import re;
import string;

# Директория проекта
DIRECTORY = '/srv/projects/www/';

# UID основного пользователя системы
USERUID   = 1000;

# Доменное имя
PREFIX='.dev';

# Директория с доступными хостами
SITE_AV='/etc/apache2/sites-available';

# Цвета, используемые для консоли
COLOR = {
  'black': "\033[0;30m",
  'red':"\033[0;31m",
  'green':"\033[0;32m",
  'lightgreen':"\033[1;32m",
  'yellow':"\033[0;33m",
  'yellows':"\033[1;33m",
  'blue':"\033[0;34m",
  'white':"\033[1;37m",
  'cyan':"\033[0;36m",
  'close':"\033[0m",
  'bold':"\033[1m",
  'italic':"\033[4m"
};

# Пути к необходимым приложениям
A2ENMOD='/usr/sbin/a2enmod';
A2DISMOD='/usr/sbin/a2dismod';
A2ENSITE='/usr/sbin/a2ensite';
A2DISSITE='/usr/sbin/a2dissite';
DJADMIN='/usr/bin/django-admin';
PYTHON='/usr/bin/python';

SSL_STRING='SSLEngine On\n  SSLCertificateFile /etc/apache2/ssl/apache.pem';

'''
Вывод цветных сообщений
'''
def message( msg='', color='white' ):
  return "%s%s%s" % (COLOR[color], msg, COLOR['close']);


'''
Функция для записи в файл
'''
def writefile(filename, mode, data):
  try:
    file = open(filename, mode);
    print>>file, data;
    file.close();
  except:
    return False;
  return True;


'''
Функция для добавления/удаления хоста
'''
def hosts(action = 'add', host = ''):
  filename = '/etc/hosts';

  if host != '' and os.path.exists(filename):
    file = open(filename);
    new_data = ''

    for line in file.readlines():
      line = line.replace('\n', '');
      if line != '' and line.find(host) == -1:
        new_data += line.strip() + '\n';
    if action == 'add':
      new_data += '127.0.0.1\t%s\n' % host;
      new_data += '127.0.0.1\twww.%s\n' % host;
    file.close();

    if writefile(filename, "w", new_data):
      return True;

  return False;


'''
Задаём активность
'''
def site_active(host_name = '', active = True):
  if active:
    action = A2ENSITE;
    hstype = 'add';
  else:
    action = A2DISSITE;
    hstype = 'del';
  # Выполняем
  os.system("%s %s >& /dev/null" % (action, host_name));
  os.system("%s %s.ssl >& /dev/null" % (action, host_name));
  os.system("/etc/init.d/apache2 restart >& /dev/null");

  # Работаем с хостами
  if not hosts(hstype, host_name):
    print message('Ошибка при работе с файлом хостов!', 'red');
    sys.exit(1);


'''
Проверим пользователя, из под которого пытаются использовать скрипт
'''
def check_user():
  if os.environ['USER'] != 'root': 
    # Сообщение
    print message('Вы не root!', 'red');
    # Завершаем сценарий
    sys.exit(1);
  return;


'''
Проверяем не вызывается ли справочная информация
'''
def helper():
  if len(sys.argv) == 2 and sys.argv[1] in ('-h', '-help', '--h', '--help', 'h', 'help'):
    print "*"*50;
    print message('APACHE HOSTS CONTROL v.0.3 -> DJAGO+PYTHON/PHP', 'yellow');
    print message('Author: GoTLiuM <gotlium@gmail.com>', 'white');
    print "*"*50;
    
    print "Для того что бы создать проект, наберите:";
    print message('$ sudo %s add <project-name>' % sys.argv[0], 'green');
    print "";
    
    print "Для удаления уже существующего проекта:";
    print message('$ sudo %s del <project-name>' % sys.argv[0], 'green');
    print "";
    
    print "Для создания ssl-сертификата, наберите:";
    print message('$ sudo %s make-ssl' % sys.argv[0], 'green');
    print "";
    
    print "Для деактивации созданного проекта, наберите:";
    print message('$ sudo %s inactive <project-name>' % sys.argv[0], 'green');
    print "";
    
    print "Для активации созданного проекта, наберите:";
    print message('$ sudo %s active <project-name>' % sys.argv[0], 'green');
    print "*"*50;
    sys.exit(0);
  return;


'''
Проверяем правильность ввода
'''
def check_argv():
  # Проверяем кол-во аргументов. Строго 3.
  if len(sys.argv) != 3:
    print message('Введенные аргументы неверные! Обратитесь к разделу помощь!', 'red');
    sys.exit(1);
  elif len(sys.argv) == 3 and not re.match('^[a-z_-]+$', sys.argv[2].strip()):
    print message('Неверно введено имя проекта!', 'red');
    sys.exit(1);
  elif len(sys.argv) == 3 and sys.argv[1] not in ('del', 'add'):
    print message('Ошибка! Обратитесь к странице помощи: %s -h!' % sys.argv[0], 'red');
    sys.exit(1);
  return;
    

'''
Создание SSL-сертификата для апача
'''
def make_ssl():
  # Проверим аргументы
  if len(sys.argv) == 2 and sys.argv[1] == 'make-ssl':
    # Создадим директорию ssl для апача
    if not os.path.exists('/etc/apache2/ssl/'):
      os.mkdir('/etc/apache2/ssl/');
    
    # создадим сертификат
    if os.path.exists('/usr/sbin/make-ssl-cert'):
      os.system("make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem");
    else:
      print message('Команда make-ssl-cert не найдена!', 'red');

    # вышли
    sys.exit(1);
  return;

'''
Задаём активность хоста
'''
def set_active():
  if len(sys.argv) == 3 and sys.argv[1] in ('active', 'inactive') and re.match('^[a-z_-]+$', sys.argv[2].strip()):
    if sys.argv[1] == 'active': aset = True;
    else: aset = False;
    host_name = sys.argv[2].strip() + PREFIX;
    if os.path.exists('/etc/apache2/sites-available/%s' % host_name):
      site_active(host_name, aset);
      print message('Ок!', 'green');
    sys.exit(1);
  return;


################################################################################
# Стандартная отработка
################################################################################

# Очищаем консоль
os.system('clear');

# Проверим не справка ли вызывается
helper();

# Проверим текущего пользователя
check_user();

# SSL сертификат
make_ssl();

# Задаём активность хост
set_active();

# Проверяем аргументы
check_argv();
